package demo.designPattern.aop.aspectJ.weavers;

/**
 * 加载时织入：实际上是将二进制织入延迟到类加载器加载类文件并将类定义给 JVM 的时刻。
 * 为了支持这一点，需要一个或多个“织入类加载器”。这些类加载器要么由运行时环境显式提供，要么通过“织入代理”启用。
 * <p>
 * AspectJ 的加载时织入可以通过一个 AspectJ 代理来启用，该代理能够参与类加载过程，并在类型定义到虚拟机之前进行织入。
 * 我们使用 -javaagent 选项指定给 JVM，例如 -javaagent:pathto/aspectjweaver.jar，或者使用 Maven 插件来配置 javaagent：
 * <blockquote><pre>
 *  <plugin>
 *     <groupId>org.apache.maven.plugins</groupId>
 *     <artifactId>maven-surefire-plugin</artifactId>
 *     <version>2.22.2</version>
 *     <configuration>
 *         <argLine>
 *             -javaagent:"${settings.localRepository}"/org/aspectj/
 *             aspectjweaver/${aspectj.version}/
 *             aspectjweaver-${aspectj.version}.jar
 *         </argLine>
 *         <useSystemClassLoader>true</useSystemClassLoader>
 *         <forkMode>always</forkMode>
 *     </configuration>
 * </plugin>
 * </pre></blockquote>
 */
public class LoadTimeDemo {

    /**
     * AspectJ 的加载时织入代理通过使用 aop.xml 文件进行配置。它在 META-INF 目录的类路径上查找一个或多个 aop.xml 文件，并聚合其内容以确定织入器配置。
     * <p>
     * 一个 aop.xml 文件包含两个关键部分：
     * <li>切面 (Aspects)：定义一个或多个切面供织入器使用，并控制在织入过程中应使用哪些切面。切面元素可以选择性地包含一个或多个 include 和 exclude 元素（默认情况下，所有定义的切面都用于织入）。
     * <li>织入器 (Weaver)：定义织入器的选项，并指定应织入的类型集合。如果未指定 include 元素，则将织入所有对织入器可见的类型。
     *
     * <blockquote><pre>
     *
     *  <aspectj>
     *     <aspects>
     *         <aspect name="com.baeldung.aspectj.AccountAspect"/>
     *         <weaver options="-verbose -showWeaveInfo">
     *             <include within="com.baeldung.aspectj.*"/>
     *         </weaver>
     *     </aspects>
     * </aspectj>
     *
     * </pre></blockquote>
     */
    public void aop_xml() {

    }

}
